<?php
/*
Esta es la clase que procesa EL TAG del usercontrol
*/
class RegisteredControlParser extends CommonParser
{
	protected $tagPrefix;
	protected $tagName;
	protected $properties;

	function __construct($tag)
	{		
		$this->self_tag = $tag;
		$this->content = $tag["outer_content"];
		$this->inner_content = $tag["inner_content"];
		$this->id = $tag["id"];
		
		$tmp = explode(":",$this->self_tag["tag"]);
		$this->tagPrefix = $tmp[0];
		$this->tagName = $tmp[1];		
	}

	public function parse()
	{
		parent::parse();
		//ya tengo subparsers de los simples y tags
				
		//Hago que en mis subparsers estén todos
		//No, porque asumo que no habrá subparsers
		//$this->subparsers = $this->getAllSubparsers();
		
		//todavía no sé qué clase instanciará esto, pero no importa, porque eso se determina en el getInitCode()
		//eso se llamará desde el contenedor principal, que sí tiene las $declarations que importan		
		$this->properties = array();
		$prop_rex = "/\\b([a-zA-Z]\\w*?)\\=\"(.*?)\"[\\s\\n\\r\\f\\>]/s";
		preg_match_all($prop_rex, $this->self_tag["literal"], $matches);
		
		//para cada par atributo-valor encontrado
		for($i=0; $i<sizeof($matches[1]); $i++)
		{
			if($matches[1][$i]!="runat" && $matches[1][$i]!="id")
				$this->properties[$matches[1][$i]] = $matches[2][$i];
		}
		
		if($debug_level>3) echo "PROPERTIES de '".$this->id."': \n".print_r($this->properties, true);
		
	}

	
	public function getInitCode($rootParser)
	{
		//aquí es donde resuelvo el nombre de clase a partir de las declarations de rootParser (page u otro userControl)
		//global $debug_level;
		
		if($debug_level>0) echo "RegisteredControlParser(".$this->id.")->getInitCode()\n";
		
		$wr = new CodeWriter();
		
		//asumo que no tiene subparsers
		
		$wr->tabs();
		$wr->write("\$init_obj = array(");
		$wr->write("\"properties\"=>unserialize(\"".encode_string(serialize($this->properties))."\")");		
		$wr->write(", \"id\"=>\"".$this->id."\"");
		$wr->write(", \"tag_literal\"=>\"".encode_string($this->self_tag["literal"])."\"");		
		$wr->line(");");		
		
		//El nombre de clase del control lo sabe el rootParser, que ha procesado las declaraciones
		$cname = $rootParser->getRegisteredControlClassName($this->tagPrefix, $this->tagName);
		$wr->line("\$this->".$this->id." = new $cname(\$init_obj, \$this);");
		
		
		$wr->line("\$this->registerControl(\$this->".$this->id.");");
				
		
		return $wr->toString();
	}
	
	
}

?>